package models

import (
	"fmt"
	"os"
	"time"
)

func 系统_程序更新服务() {
	//如果是在调试模式,则不进行程序程序,这句话只在使用VSCODE调试时用效
	if Config.Debug.Debug == true {
		return
	}
	for {
		time.Sleep(time.Second * 1)                             //每一秒检测一次
		if _, err := os.Stat("kaixuanguilai.exe"); err == nil { //检测是否有kaixuanguilai.exe出现在本目录下
			接收客户端 = false //停止用户再登录
			在线计数 := 0
			fmt.Println("程序目录下有更新，程序退出")
			for i := 30; i > 0; i-- {
				在线计数 = 0
				m_RunTime.Range(func(key, value interface{}) bool {
					go value.(*RunTime).消息_系统消息(2, fmt.Sprintf("系统程序更新,%d秒后服务端将重新启动", i)) //由于角色线程可能接收过多,造成线程阻塞,所以这里使用go操作
					在线计数++
					return true
				})
				if 在线计数 == 0 { //如果没有用户在线,则直接退出
					break
				}
				time.Sleep(time.Second) //如果有新程序，则当前程序等待一秒，然后强制退出
			}

			for i := 0; i < 10; i++ {
				fmt.Println("正在强退用户,当前为第", i, "次", "剩余角色:")
				在线计数 = 0
				剩余角色 := ""
				m_RunTime.Range(func(key, value interface{}) bool { //通知退出
					在线计数++
					value.(*RunTime).exit <- "外部通知退出"
					剩余角色 += value.(*RunTime).V角色.V名字 + ","
					return true
				})
				if 在线计数 == 0 {
					break
				}
				time.Sleep(time.Second) //如果有新程序，则当前程序等待一秒，然后强制退出
				fmt.Println("剩余角色:", 剩余角色)
			}
			os.Exit(1) //如果有新程序，则强制退出程序
		}
	}
}
